#include <iostream>
#include <cstring>
#include <string>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
    int fd=socket(AF_INET,SOCK_STREAM,0);
    if(fd==-1)
    {
        printf("服务端：创建socket套接字失败！\n");
        return 0;
    }
    struct sockaddr_in local_addr;
    memset(&local_addr,0,sizeof(local_addr));

    local_addr.sin_family=AF_INET;
    //需要确保地址和端口号是以网络字节序（big-endian）的形式提供的，
    //而不是主机字节序。这是因为网络协议要求所有的数据在网络中传输时都使用统一的字节序，
    //以确保不同字节序的主机之间能够正确地解析数据
    local_addr.sin_port=htons(6666);
    local_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    //第二个参数要求的是传入的是一个通用结构
    int ret=bind(fd,(const struct sockaddr*)&local_addr,sizeof(local_addr));
    if(ret<0)
    {
        printf("服务端：套接字绑定ip和端口失败！\n");
        return 0;
    }

    //第一个参数监听哪个套接字，第二个参数等待连接的队列长度，如果服务端没有accept（未完成三次握手），则放到这个队列里
    ret=listen(fd,8);
    if(ret<0)
    {
        printf("服务端：监听套接字失败!\n");
        return 0;
    }

    //接收客户端连接，并生成通信套接字
    //接收连接套接字，客户端的地址，客户端的地址的长度
    int connfd=accept(fd,nullptr,nullptr);
    if(connfd<0)
    {
        printf("服务端：获取连接失败！\n");
        return 0;
    }
    char buf[1024];
    while(1)
    {
        memset(buf,0,sizeof(buf));
        ret=read(connfd,buf,sizeof(buf));
        if(ret<0)
        {
            printf("服务端：读取数据失败！\n");
            break;
        }
        else if(ret==0)
        {
            printf("连接关闭\n");
            break;
        }
        else{
            printf("服务端接收到数据：%s\n",buf);
            
            std::string returnBuf=buf;

            returnBuf="服务端已收到数据："+returnBuf;
            write(connfd,returnBuf.c_str(),sizeof(returnBuf));
                
        }
    }


    close(fd);
    close(connfd);
    return 0;
}